为了重构项目的css代码,先体验了
less,但发现less不能满足我的需求,没办法转为sass,在此描述一下自我感受这两者的区别。我描述的只是我直观使用的部分,大部分的不同点百度一下,第一页的全一样。。。
判断条件的区别(感觉最重要的地方)
less写mixin时判断的唯一关键字就是when,而我需要生成复合样式中的一部分,像这样:1
2
3
4a{
border-right:1px;
border-bottom:2px;
}
要选择性的生成部分属性,less很不方便,可以参考前面一篇文章less实战全解之复合样式mixin
sass的判断关键字很符合我们的习惯@if、@else、@else if,还有其他的@for、@each,非常强大。额…有点跑题,继续。那么用sass处理符合属性可以写成这样,不会生成多余的属性:1
2
3
4
5
6
7
8@mixin position($position,$top:null,$right:null,$bottom:null,$left:null,$z-index:null){
position: $position;
@if $top{top: $top;}
@if $right{right: $right;}
@if $bottom{bottom: $bottom;}
@if $left{left: $left;}
@if $z-index{z-index: $z-index;}
}
假设要编译成这样的css:
1  | position: absolute;  | 
使用的方式有两种:
1  | //方法1,最后一个"有效参数"前面的参数设为null,后面的不用管,因为参数默认值就是null  | 
而且像sass写的这种:支持多属性的0%和100%
1  | @mixin frames($props,$starts,$ends){  | 
less由于缺少for这种关键字,只能通过递归实现循环,要实现上面的效果,想想就醉了
import的路径问题
less:可以使用相对路径和绝对路径,可以参考前面的文章sass:可以使用相对路径,绝对路径好像不可以,我尝试了很多次,依旧不行,不知道是不是我尝试的有问题,请知道的前辈告诉我。语法没有less的小括号,如下:1
@import "../../furnace/sass/_base";
使用mixin
less:只能放在选择器内,不能放在外面,以至于我只能这样定义一个动画,而不能使用公共mixin定义动画1
2
3
4
5
6
7.blink {
.animation(blink 1.8s infinite);
}
@-webkit-keyframes blink {.keyframes-opacity(10,0);}
@-moz-keyframes blink {.keyframes-opacity(10,0);}
@-o-keyframes blink {.keyframes-opacity(10,0);}
@keyframes blink {.keyframes-opacity(10,0);}sass:可以放在外面,然后代码就变成了这样:1
2
3
4.blink {
@include animation(blink 1.8s infinite);
}
@include keyframes-opacity(blink);
是不是简练了很多?
内部函数
编译
grunt插件编译
很多人选择用less是因为用sass是基于ruby的,所以选择了less,我在使用的过程中用了这样两个插件,都是grunt的,gulp当然也有。下面我的两个插件:
此处不使用grunt官方团队的grunt-contrib-sass,因为它需要ruby环境的支持
使用grunt-sass,就不需要安装ruby环境了,因为它是用node-sass编译的,只需要用npm安装了node-sass就可以编译了。这是我的Gruntfile.js:
1  | grunt.initConfig({  | 
命令行使用:
1  | grunt watch  | 
js编译,方便调试
less是基于JavaScript,所以,是在客户端处理的。官方提供了less.js文件,放在html里直接就可以编译,很方便.sass是基于服务端的,但有牛人创造了sass.js,主要由:sass.js、sass.work.js和sass.sync.js组成。如果你的浏览器支持h5的 Web Worker,请使用sass.js和sass.work.js,我这儿就用的这两个文件。如果不支持,就使用sass.js和sass.sync.js。使用如下:
(1)直接在html中使用sass.js
1  | <html xmlns="http://www.w3.org/1999/xhtml">  | 
(2)在对应的模块js中使用
我们使用了sea.js来模块化,本来官方介绍是简单的require之后就可以使用,官方demo:
1  | define(function defineSassModule(require) {  | 
但是在我的项目里并不成功,提示require返回的对象是underfined,注意到了sass.js里面的这段代码:
1  | (function (root, factory) {  | 
所以,require之后的对象被绑定到了window上,于是,代码修改为:
1  | define(function(require, exports, module) {  | 
然后在浏览器中开心的调试sass吧…
最终,我还是比较喜欢sass。最后放个我总结的sass使用规范和_base.scss:


